/**
 * 日期格式化工具函数
 */

/**
 * 格式化日期为 YYYY-MM-DD 格式
 * @param date 日期字符串、时间戳或Date对象
 * @returns 格式化后的日期字符串
 */
export const formatDate = (date: string | number | Date | undefined): string => {
  if (!date) return ''

  let dateObj: Date

  if (typeof date === 'number') {
    // 处理时间戳
    dateObj = new Date(date)
  } else if (typeof date === 'string') {
    // 处理字符串
    dateObj = new Date(date)
  } else {
    // 处理Date对象
    dateObj = date
  }

  if (isNaN(dateObj.getTime())) return ''

  const year = dateObj.getFullYear()
  const month = String(dateObj.getMonth() + 1).padStart(2, '0')
  const day = String(dateObj.getDate()).padStart(2, '0')

  return `${year}-${month}-${day}`
}

/**
 * 格式化日期为 MM-DD 格式（简短格式）
 * @param date 日期字符串或Date对象
 * @returns 格式化后的日期字符串
 */
export const formatDateShort = (date: string | Date | undefined): string => {
  if (!date) return ''

  const dateObj = typeof date === 'string' ? new Date(date) : date

  if (isNaN(dateObj.getTime())) return ''

  const month = String(dateObj.getMonth() + 1).padStart(2, '0')
  const day = String(dateObj.getDate()).padStart(2, '0')

  return `${month}-${day}`
}

/**
 * 格式化日期时间为 YYYY-MM-DD HH:mm 格式
 * @param date 日期字符串或Date对象
 * @returns 格式化后的日期时间字符串
 */
export const formatDateTime = (date: string | Date | undefined): string => {
  if (!date) return ''

  const dateObj = typeof date === 'string' ? new Date(date) : date

  if (isNaN(dateObj.getTime())) return ''

  const year = dateObj.getFullYear()
  const month = String(dateObj.getMonth() + 1).padStart(2, '0')
  const day = String(dateObj.getDate()).padStart(2, '0')
  const hours = String(dateObj.getHours()).padStart(2, '0')
  const minutes = String(dateObj.getMinutes()).padStart(2, '0')

  return `${year}-${month}-${day} ${hours}:${minutes}`
}

/**
 * 计算两个日期之间的天数差（包含起始日期和结束日期）
 * @param startDate 开始日期（字符串、时间戳或Date对象）
 * @param endDate 结束日期（字符串、时间戳或Date对象）
 * @returns 天数差（包含起始和结束日期）
 */
export const calculateDaysDiff = (startDate: string | number | Date, endDate: string | number | Date): number => {
  let start: Date, end: Date

  if (typeof startDate === 'number') {
    start = new Date(startDate)
  } else if (typeof startDate === 'string') {
    start = new Date(startDate)
  } else {
    start = startDate
  }

  if (typeof endDate === 'number') {
    end = new Date(endDate)
  } else if (typeof endDate === 'string') {
    end = new Date(endDate)
  } else {
    end = endDate
  }

  if (isNaN(start.getTime()) || isNaN(end.getTime())) return 0

  // 将日期设置为当天的开始时间（00:00:00），避免时间部分影响计算
  const startOfDay = new Date(start.getFullYear(), start.getMonth(), start.getDate())
  const endOfDay = new Date(end.getFullYear(), end.getMonth(), end.getDate())

  const diffTime = Math.abs(endOfDay.getTime() - startOfDay.getTime())
  const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + 1 // +1 是因为包含起始日期和结束日期

  return diffDays
}

/**
 * 计算请假天数
 * @param startDate 开始日期
 * @param endDate 结束日期
 * @returns 请假天数
 * 
 * 计算逻辑说明：
 * - 如果开始日期和结束日期是同一天，返回1天
 * - 如果跨越多天，计算实际天数差 + 1（包含起始日期）
 * - 例如：2024-01-01 到 2024-01-03，应该是3天（1号、2号、3号）
 */
export const calculateLeaveDays = (startDate: string | Date, endDate: string | Date): number => {
  if (!startDate || !endDate) return 0

  const start = typeof startDate === 'string' ? new Date(startDate) : startDate
  const end = typeof endDate === 'string' ? new Date(endDate) : endDate

  if (isNaN(start.getTime()) || isNaN(end.getTime())) return 0

  // 将时间设置为当天的开始，避免时间部分影响计算
  const startOfDay = new Date(start.getFullYear(), start.getMonth(), start.getDate())
  const endOfDay = new Date(end.getFullYear(), end.getMonth(), end.getDate())

  // 计算天数差
  const diffTime = endOfDay.getTime() - startOfDay.getTime()
  const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + 1

  return Math.max(diffDays, 1) // 至少1天
}

/**
 * 获取相对时间描述（如：今天、昨天、3天前等）
 * @param date 日期字符串或Date对象
 * @returns 相对时间描述
 */
export const getRelativeTime = (date: string | Date | undefined): string => {
  if (!date) return ''

  const dateObj = typeof date === 'string' ? new Date(date) : date

  if (isNaN(dateObj.getTime())) return ''

  const now = new Date()
  const diffTime = now.getTime() - dateObj.getTime()
  const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24))

  if (diffDays === 0) {
    return '今天'
  } else if (diffDays === 1) {
    return '昨天'
  } else if (diffDays === -1) {
    return '明天'
  } else if (diffDays > 1 && diffDays <= 7) {
    return `${diffDays}天前`
  } else if (diffDays < -1 && diffDays >= -7) {
    return `${Math.abs(diffDays)}天后`
  } else {
    return formatDate(dateObj)
  }
}